package org.iteracionI.persis;


import java.awt.List;
import java.io.File;
import java.sql.*;
import java.util.LinkedList;
import java.util.Vector;

public class AgenteBD {
    //instancia del agente
    protected static AgenteBD mInstancia=null;
    //Conexion con la base de datos
    protected static Connection mBD;
    //Identificador ODBC de la base de datos
    private static String url="jdbc:sqlite:basedatos.db";
    //Driven para conectar con bases de datos sqlite
    private static String driver="org.sqlite.JDBC";
    
    //Constructor
    private AgenteBD()throws Exception {
    	conectar();
    }
    
    //Implementacion del patron singleton
    //Este patron de dise�o permite implementar clases de las cuales
    //solo existir una instancia
    //http://es.wikipedia.org/wiki/Singleton
     public static AgenteBD getAgente() throws Exception{
        if (mInstancia==null){
        	mInstancia=new AgenteBD();
        	mInstancia.crear();
        }
        return mInstancia;
     }
 
    public void eliminarBDanterior() throws Exception{
    	desconectar();
    	File basedatos = new File("basedatos.db");
    	basedatos.delete();
    }
     //Metodo para crear la base de datos para que no haya inconsistencias
    public void crear() throws Exception{
    	eliminarBDanterior();
    	conectar();
    	Statement stmt;
        stmt = mBD.createStatement();
        String sql = "CREATE TABLE Usuarios " +
                     "(nombre TEXT ,"+" apellido1 TEXT , "+"apellido2 TEXT, "+"login TEXT, "+"password TEXT, "+"tipo TEXT)"; 
        stmt.executeUpdate(sql);
        sql = "CREATE TABLE Libros " +
                "(titulo TEXT ,"+" autor TEXT , "+"signatura TEXT, "+"isbn TEXT, "+"disponibilidad TEXT)";
        stmt.executeUpdate(sql);
        sql = "CREATE TABLE Prestamos " +
                "(usuario TEXT ,"+" dias TEXT , "+"isbn TEXT)";
        stmt.executeUpdate(sql);
        sql = "CREATE TABLE Idioma " + "(idioma TEXT)";
        stmt.executeUpdate(sql);
        sql = "INSERT INTO Usuarios (nombre,apellido1,apellido2,login,password,tipo) " +
                "VALUES ('Cliente', 'Sanchez', 'Lopez', 'client', '123456', 'Cliente');";
        stmt.executeUpdate(sql);
        sql = "INSERT INTO Usuarios (nombre,apellido1,apellido2,login,password,tipo) " +
                "VALUES ('Trabajador', 'Lopez', 'Sanchez', 'worker', '123456', 'Trabajador');";
        stmt.executeUpdate(sql);
        sql = "INSERT INTO Libros (titulo,autor,signatura,isbn,disponibilidad) " +
                "VALUES ('El Francotirador Paciente', 'Arturo Perez Reverte', 'APR1', '971542285246',1);";
        stmt.executeUpdate(sql);
        sql = "INSERT INTO Libros (titulo,autor,signatura,isbn,disponibilidad) " +
                "VALUES ('Ambiciones y Reflexiones', 'Belen Esteban', 'BE1', '456785465125',1);";
        stmt.executeUpdate(sql);
        sql = "INSERT INTO Libros (titulo,autor,signatura,isbn,disponibilidad) " +
                "VALUES ('Logica Simbolica para Informaticos', 'Pascual Julian Iranzo', 'PJ1', '146561233245',1);";
        stmt.executeUpdate(sql);
        stmt.close();
        desconectar();
    }
    //Metodo para realizar la conexion a la base de datos 
    private void conectar() throws Exception {
    	Class.forName(driver);
    	mBD = DriverManager.getConnection(url);
    }

    
    //Metodo para desconectar de la base de datos
    public void desconectar() throws Exception{
    	mBD.close();
    }

    //Metodo para realizar una insercion en la base de datos
    public int insert(String SQL) throws SQLException, Exception{ 
     	conectar();
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    //Metodo para realizar una eliminacion en la base de datos
    public int delete(String SQL) throws SQLException,Exception{
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    //Metodo para realizar una eliminacion en la base de datos
    public int update(String SQL) throws SQLException,Exception{
    	conectar();
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    
	public Vector<Object> selectUser(String SQL) throws SQLException,Exception{
            conectar();
            Vector<Object> v = new Vector(1,1);
            Vector<Object> datos = new Vector (1,1);
            ResultSet resultado;
            Statement stmt = mBD.createStatement();   
            resultado = stmt.executeQuery(SQL);
            while (resultado.next()){
                String tipo = resultado.getString("tipo");
                datos.addElement(tipo);
                v.addElement(datos);
            }
            stmt.close();
            desconectar();
            return v;
	}
	
	public Vector<Object> selectBook(String SQL) throws SQLException,Exception{
        conectar();
        Vector<Object> v = new Vector(1,1);
        Vector<Object> datos = new Vector (1,1);
        ResultSet resultado;
        Statement stmt = mBD.createStatement();   
        resultado = stmt.executeQuery(SQL);
        while (resultado.next()){
            String titulo = resultado.getString("titulo");
            datos.addElement(titulo);
            String autor = resultado.getString("autor");
            datos.addElement(autor);
            String signatura = resultado.getString("signatura");
            datos.addElement(signatura);
            String ISBN = resultado.getString("isbn");
            datos.addElement(ISBN);
            String disponibilidad = resultado.getString("disponibilidad");
            datos.addElement(disponibilidad);
            v.addElement(datos);
        }
        stmt.close();
        desconectar();
        return v;
	}

	public Vector<Object> selectPrestamo(String SQL) throws SQLException,Exception{
        conectar();
        Vector<Object> v = new Vector(1,1);
        Vector<Object> datos = new Vector (1,1);
        ResultSet resultado;
        Statement stmt = mBD.createStatement();   
        AgenteBD a = new AgenteBD();
        resultado = stmt.executeQuery(SQL);
        while (resultado.next()){
            String usuario = resultado.getString("usuario");
            datos.addElement(usuario);
            String dias = resultado.getString("dias");
            datos.addElement(dias);
            String isbn = resultado.getString("isbn");
            datos.addElement(isbn);
            v.addElement(datos);
        }
        stmt.close();
        desconectar();
        return v;
	}
	
	public Vector<Object> selectIdioma(String SQL) throws SQLException,Exception{
        conectar();
        Vector<Object> v = new Vector(1,1);
        Vector<Object> datos = new Vector (1,1);
        ResultSet resultado;
        Statement stmt = mBD.createStatement();   
        resultado = stmt.executeQuery(SQL);
        while (resultado.next()){
            String tipo = resultado.getString("idioma");
            datos.addElement(tipo);
            v.addElement(datos);
        }
        stmt.close();
        desconectar();
        return v;	
	}
	
}